package com.tarena.lbs.content.dao.repository.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.tarena.lbs.content.dao.mapper.ArticleMapper;
import com.tarena.lbs.content.dao.repository.ArticleRepository;
import com.tarena.lbs.content.pojo.po.ArticlePO;
import com.tarena.lbs.content.pojo.query.ArticleQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

/**
 * 文章仓库实现类
 */
@Repository
public class ArticleRepositoryImpl implements ArticleRepository {

    @Autowired
    private ArticleMapper articleMapper;

    @Override
    public PageInfo<ArticlePO> pageList(ArticleQuery query) {
        // 设置分页参数
        if (query != null && query.getPageNo() != null && query.getPageSize() != null) {
            PageHelper.startPage(query.getPageNo(), query.getPageSize());
        }

        // 构建查询条件
        QueryWrapper<ArticlePO> queryWrapper = assembleArticleQuery(query);

        // 执行查询
        List<ArticlePO> list = articleMapper.selectList(queryWrapper);

        // 包装为PageInfo返回
        return new PageInfo<>(list);
    }

    @Override
    public ArticlePO getById(Integer id) {
        if (id == null || id <= 0) {
            return null;
        }
        return articleMapper.selectById(id);
    }
    @Override
    public int deleteArticle(Integer id) {
        if (id == null || id <= 0) {
            return 0;
        }

        // 假删除：将删除状态设置为1
        UpdateWrapper<ArticlePO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", id);
        updateWrapper.set("delete_status", 1); // 1表示已删除
        updateWrapper.set("update_time", new Date());

        return articleMapper.update(null, updateWrapper);
    }

    /**
     * 根据查询参数构建QueryWrapper
     */
    private QueryWrapper<ArticlePO> assembleArticleQuery(ArticleQuery query) {
        QueryWrapper<ArticlePO> queryWrapper = new QueryWrapper<>();

        if (query == null) {
            // 默认查询未删除的数据
            queryWrapper.eq("delete_status", 0);
            return queryWrapper;
        }

        // 只有当明确指定要包含已删除数据时，才不添加这个条件
        if(query.getIncludeDeleted() == null || !query.getIncludeDeleted()){
            queryWrapper.eq("delete_status", 0);
        }
        // 根据场景类型决定显示上线或下线文章
        // sceneType为1时（文章列表）只显示上线文章
        // sceneType为2时（推文创作）只显示下线文章
        if (query.getSceneType() == null || query.getSceneType() == 1) {
            queryWrapper.eq("online_status", 1);
        } else if (query.getSceneType() == 2) {
            queryWrapper.eq("online_status", 0);
        }

        // 文章ID - 只在id大于0时添加查询条件
        if (query.getId() != null && query.getId() > 0) {
            queryWrapper.eq("id", query.getId());
        }

        // 文章标题（模糊查询）
        if (query.getArticleTitle() != null && !query.getArticleTitle().trim().isEmpty()) {
            queryWrapper.like("article_title", query.getArticleTitle());
        }

        // 文章分类ID - 只在分类ID大于0时添加查询条件
        if (query.getArticleCategoryId() != null && query.getArticleCategoryId() > 0) {
            queryWrapper.eq("article_category_id", query.getArticleCategoryId());
        }

        // 文章标签（模糊查询）
        if (query.getArticleLabel() != null && !query.getArticleLabel().trim().isEmpty()) {
            queryWrapper.like("article_label", query.getArticleLabel());
        }

        // 文章启用状态过滤
        if (query.getArticleStatus() != null && !query.getArticleStatus().isEmpty()) {
            // 如果列表只有一个元素，使用等于查询
            if (query.getArticleStatus().size() == 1) {
                queryWrapper.eq("article_status", query.getArticleStatus().get(0));
            } else {
                // 如果列表有多个元素，使用IN查询
                queryWrapper.in("article_status", query.getArticleStatus());
            }
        }

        // 文章来源 - 只在来源大于0时添加查询条件
        if (query.getSource() != null && query.getSource() > 0) {
            queryWrapper.eq("source", query.getSource());
        }

        // 活动ID - 只在活动ID大于0时添加查询条件
        if (query.getActivityId() != null && query.getActivityId() > 0) {
            queryWrapper.eq("activity_id", query.getActivityId());
        }
        
        // 活动标题 - 模糊查询
        if (query.getActivityName() != null && !query.getActivityName().trim().isEmpty()) {
            queryWrapper.like("activity_name", query.getActivityName());
        }

        // 用户ID - 只在用户ID大于0时添加查询条件
        if (query.getUserId() != null && query.getUserId() > 0) {
            queryWrapper.eq("user_id", query.getUserId());
        }

        // 时间范围查询
        if (query.getUpdateStartTime() != null) {
            queryWrapper.ge("update_time", query.getUpdateStartTime());
        }
        if (query.getUpdateEndTime() != null) {
            queryWrapper.le("update_time", query.getUpdateEndTime());
        }

        // 先按上线状态降序排序（已启用的在停用的前面），再按更新时间倒序排序
        queryWrapper.orderByDesc("online_status");

        return queryWrapper;
    }
    @Override
    public int updateStatus(Integer id, Integer articleStatus, Integer onlineStatus) {
        if (id == null || id <= 0) {
            return 0;
        }

        UpdateWrapper<ArticlePO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", id);
        updateWrapper.set("update_time", new Date());

        if (articleStatus != null) {
            updateWrapper.set("article_status", articleStatus);
        }

        if (onlineStatus != null) {
            updateWrapper.set("online_status", onlineStatus);
        }

        return articleMapper.update(null, updateWrapper);
    }
    
    @Override
    public int insertArticle(ArticlePO articlePO) {
        // 设置创建时间和更新时间
        if (articlePO.getCreateTime() == null) {
            articlePO.setCreateTime(new Date());
        }
        if (articlePO.getUpdateTime() == null) {
            articlePO.setUpdateTime(new Date());
        }
        
        // 设置默认值
        if (articlePO.getDeleteStatus() == null) {
            articlePO.setDeleteStatus(0); // 0表示未删除
        }
        if (articlePO.getOnlineStatus() == null) {
            articlePO.setOnlineStatus(1); // 1表示上线
        }
        
        return articleMapper.insert(articlePO);
    }

    @Override
    public int updateArticle(ArticlePO articlePO) {
        if (articlePO == null || articlePO.getId() == null || articlePO.getId() <= 0) {
            return 0;
        }

        // 设置更新时间
        articlePO.setUpdateTime(new Date());

        return articleMapper.updateById(articlePO);
    }
}